//go:build solaris
// +build solaris

package directio

/*
#include <fcntl.h>
#include <unistd.h>
#include <stropts.h>

int enable_directio(int fd) {
    return directio(fd, DIRECTIO_ON);
}
*/
import "C"
import (
	"os"
	"syscall"
)

const (
	// Solaris 通常扇区对齐为 512 字节
	AlignSize = 512
	BlockSize = 512
)

// OpenFile 打开文件并启用 Direct I/O 模式（通过 directio 系统调用）
func OpenFile(name string, flag int, perm os.FileMode) (*os.File, error) {
	// 注意：不能直接用 syscall.O_DIRECT，因此不能在 flag 中使用
	f, err := os.OpenFile(name, flag, perm)
	if err != nil {
		return nil, err
	}

	// 获取文件描述符
	fd := f.Fd()

	// 启用 Direct I/O
	if ret := C.enable_directio(C.int(fd)); ret != 0 {
		f.Close()
		return nil, os.NewSyscallError("directio", syscall.Errno(ret))
	}

	return f, nil
}
